00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef DEBRUSH_PRIV_HPP
00029 #define DEBRUSH_PRIV_HPP
00030
00031 #include "deBrush.hpp"
00032 #include "deMath.hpp"
00033 #include "deLine.hpp"
00034 #include "deHash.hpp"
00035 #include "deFunctors.hpp"
00036 #include "deWorld_Helper.hpp"
00037
00038 class deBPoly
00039 {
00040 public:
00041 deVec3d Normal;
00042 deDouble Dist;
00043 deLVert *Verts;
00044 long TextureIndex;
00045 long NumVerts;
00046 deBPoly(long verts = 3);
00047 ~deBPoly();
00048 deBPoly(const deBPoly & ref) ;
00049 deBPoly & operator=(deBPoly & ref);
00050 void Resize(long verts);
00051 };
00052
00053 #pragma warning (disable : 4512) // assignment operator
00054
00055 class deBrush : public deWorldObject, virtual public IdeBrush
00056 {
00057 public:
00058 virtual ~deBrush();
00059
00060 void* GetWOInterface(long interface_id);
00061 deBoolean Serialize(IdeFile* FS);
00062 deBoolean DeSerialize(IdeFile* FS, long DataLength);
00063 deBoolean DeSerializeLoad();
00064
00065 void* GetBrushInterface(deBrushType Type) const;
00066
00067 void GetWorldTransform(deTransformInfo & Matrix) const;
00068
00069 void Rotate(deVec3d &Center, deVec3d &Axis, deDouble Degrees);
00070 void Rotate(deVec3d &Center, deTransformInfo &M);
00071 void Translate(deVec3d &Delta);
00072 void Scale(deVec3d &Center, deDouble Scale);
00073
00074 deBoolean Update();
00075 long GetLOD() const;
00076 long GetLOD2() const;
00077 void SetLOD(long LOD);
00078 void SetLOD2(long LOD2);
00079
00080 long GetTexFacesNum();
00081 long GetTexCoordsNum(long faceindex);
00082 deTexCoord GetTexCoord(long faceindex, long index);
00083 void SetTexCoord(long faceindex, long index, deTexCoord &coord);
00084 void SetTexCoord(long faceindex, long index, deFloat u, deFloat v);
00085 void SetTexture(long faceindex, IdeRenderTexture * tex);
00086 IdeRenderTexture* GetTexture(long faceindex);
00087 void SetSmooth(deBoolean SmoothNotSharp);
00088 deBoolean GetSmooth();
00089
00090 long GetNumCVs();
00091 void GetCVList(deVec3d buffer[]);
00092 deVec3d GetCV(long num);
00093 deBoolean SetCV(long num, deVec3d & CV);
00094 deBoolean SetCVList(long num, deVec3d CVList[]);
00095 deBoolean AddCV(deVec3d & point);
00096
00097 IdeBrush * Copy();
00098
00099 void GetAABB(deVec3d &Mins, deVec3d &Maxs);
00100
00101
00102 long GetNumVBs();
00103 IdeVertexBuffer * GetVertexBuffer(long index);
00104 void SetDiffuseColor(deARGB color);
00105 deARGB GetDiffuseColor();
00106
00107 void Subtract(IdeBrush * cutter);
00108
00109 static void MakeTri(deBPoly & Result,
00110 deVec3d &Vert1, deVec3d &Vert2, deVec3d &Vert3);
00111 static void MakeTri(deBPoly & Result,
00112 deVec3d &Vert1, deVec3d &Vert2, deVec3d &Vert3,
00113 deVec3d &Norm1, deVec3d &Norm2, deVec3d &Norm3);
00114 static void MakeTri(deBPoly & Result,
00115 deVec3d &Vert1, deVec3d &Vert2, deVec3d &Vert3,
00116 deVec3d &Norm1, deVec3d &Norm2, deVec3d &Norm3,
00117 deColor &Color1, deColor &Color2, deColor &Color3);
00118 static void MakeTri(deBPoly & Result,
00119 deVec3d &Vert1, deVec3d &Vert2, deVec3d &Vert3,
00120 deVec3d &Norm1, deVec3d &Norm2, deVec3d &Norm3,
00121 deTexCoord &Coord1, deTexCoord &Coord2, deTexCoord &Coord3);
00122 static void MakeTri(deBPoly & Result,
00123 deVec3d &Vert1, deVec3d &Vert2, deVec3d &Vert3,
00124 deVec3d &Norm1, deVec3d &Norm2, deVec3d &Norm3,
00125 deColor &Color1, deColor &Color2, deColor &Color3,
00126 deTexCoord &Coord1, deTexCoord &Coord2, deTexCoord &Coord3);
00127
00128 struct DataQuantity_t
00129 {
00130 enum QuantityRatio_t
00131 {
00132 Quantity_Unmanaged = 0,
00133 Quantity_Constant,
00134 Quantity_PerCV,
00135 Quantity_Force32 = 0x7fffffff,
00136 } QuantityRatio;
00137 long CVNum;
00138 long NumFaces;
00139 long CoordsPerFace;
00140 };
00141
00142
00143 protected:
00144
00145 deBrush(IdeBrush::deBrushType Type, const DataQuantity_t &QuantityDefs);
00146
00147 enum DrawType
00148 {
00149 Points,
00150 LineList,
00151 LineStrip,
00152 TriList = 0,
00153 TriStrip,
00154 TriFan
00155 };
00156
00157 virtual void SpecificRotate(deVec3d Center, deTransformInfo &M);
00158 virtual void SpecificTranslate(deVec3d Delta);
00159 virtual void SpecificScale(deVec3d Center, deDouble Scale);
00160 virtual void UpdateBrush() = 0;
00161 virtual deBrush * CopyBrush() = 0;
00162
00163 deBoolean FillVertexBuffers();
00164 deBoolean FillIndexedBuffers();
00165 void ClearGeometry();
00166 void ResizeLists(long size);
00167 deBoolean RecalcListQuantities(deBoolean Creation = deFALSE);
00168
00169 protected:
00170
00171 const DataQuantity_t& m_QuantityDefs;
00172 deTransform m_WorldTransform;
00173 long m_CVNum;
00174 deTArray <deVec3d> m_CVList;
00175 deTArray <deTArray<deTexCoord> > m_FaceList;
00176 deTArray <IdeRenderTexture*> m_TextureList;
00177 deTArray <IdeVertexBuffer*> m_SubVBs;
00178 deTArray <DrawType> m_DrawTypeList;
00179 IdeVertexBuffer* m_MainVBuffer;
00180 long m_LOD, m_LOD2;
00181 deBoolean m_SmoothNormals;
00182 deBoolean m_Changed;
00183 deBoolean m_UsingIndexedBuffer;
00184 deBoolean m_SaveVBuffers;
00185 deARGB m_DiffuseColor;
00186
00187
00188 deTList <deBPoly> m_PolyList;
00189 deTArray <deTList <BIndexList> > m_IndexedBuffers;
00190 deTArray <deIDPair> m_CachedTextures;
00191
00192
00193
00194
00195
00196
00197
00198
00199 private:
00200 const IdeBrush::deBrushType m_Type;
00201 };
00202
00203 class deGroupBrush : public IdeGroupBrush, public deBrush
00204 {
00205 public:
00206 deGroupBrush();
00207 ~deGroupBrush();
00208
00209 WorldObjectClassDef;
00210
00211 bool AddBrush(IdeBrush* brush);
00212 bool RemoveBrush(IdeBrush* brush);
00213
00214 void GetBrushList(deTList <IdeBrush*> &list);
00215
00216 protected:
00217 deBrush * CopyBrush();
00218 void SpecificRotate(deVec3d Center, deTransformInfo &M);
00219 void SpecificTranslate(deVec3d Delta);
00220 void SpecificScale(deVec3d Center, deDouble Scale);
00221
00222 private:
00223 void UpdateBrush();
00224 deTList <IdeBrush*> m_BrushList;
00225 };
00226
00227 class deLineBrush : public IdeLineBrush, public deBrush
00228 {
00229 public:
00230 deLineBrush();
00231 ~deLineBrush();
00232
00233 WorldObjectClassDef;
00234
00235 protected:
00236 deBrush * CopyBrush();
00237
00238 private:
00239 void UpdateBrush();
00240 };
00241
00242 struct edge_normals { bool PairedFaces; short CV1, CV2; deVec3d Norm1, Norm2; };
00243 struct edge { short p1, p2, p_opp; };
00244 class deBlockBrush : public IdeBlockBrush, public deBrush
00245 {
00246 public:
00247 deBlockBrush();
00248 ~deBlockBrush();
00249
00250 WorldObjectClassDef;
00251
00252 deBoolean GetProjectedEdgePlanes(const deVec3d & Position, const deTransformInfo & transform, IdePlaneFrustum* pFrustum);
00253
00254 protected:
00255 deBrush * CopyBrush();
00256
00257 private:
00258 void UpdateBrush();
00259
00260 void SubdivideSurfaces();
00261
00262
00263
00264
00265 void GiftWrap();
00266 short FindA();
00267 short FindB(short A);
00268 short FindC(short A, short B, short DontUse);
00269 bool PointTotallyUsed(short p);
00270 void RecalcEdgeConnectivity();
00271
00272 deTArray <bool> m_TotallyUsed;
00273 deTArray< deTList<edge> > m_EdgesOnVert;
00274 deTArray <edge> m_FaceList;
00275 deTArray<edge_normals> m_EdgeNormals;
00276 deBoolean m_EdgesUpdated;
00277
00278 deDouble Dist(deBPoly & poly, deVec3d Point);
00279 void MakeTri(long v1, long v2, long v3, deBPoly&);
00280 };
00281
00282 class deCylinderBrush : public IdeCylinderBrush, public deBrush
00283 {
00284 public:
00285 deCylinderBrush();
00286 ~deCylinderBrush();
00287
00288 WorldObjectClassDef;
00289
00290 protected:
00291 deBrush * CopyBrush();
00292
00293 private:
00294 void UpdateBrush();
00295
00296 void GenerateHull();
00297 void GenerateHull2();
00298 deDouble Dist(const deVec3d &LineP1, const deVec3d &LineP2, const deVec3d &P3);
00299 };
00300
00301 class deLathedBrush : public IdeLathedBrush, public deBrush
00302 {
00303 public:
00304 deLathedBrush();
00305 ~deLathedBrush();
00306
00307 WorldObjectClassDef;
00308
00309 void SetLine(IdeLine * line);
00310 IdeLine * GetLine();
00311
00312 void SetStyle(LatheStyle style);
00313 LatheStyle GetStyle();
00314 void SetDegree(deDouble RotDegree);
00315 deDouble GetDegree();
00316
00317 protected:
00318 deBrush * CopyBrush();
00319
00320 private:
00321 void UpdateBrush();
00322
00323 void Lathe();
00324 deDouble Dist(deVec3d LineP1, deVec3d LineP2, deVec3d Pt);
00325
00326 IdeLine * m_Line;
00327 LatheStyle m_Style;
00328 deDouble m_Degree;
00329 };
00330
00331 class deExtrudedBrush : public IdeExtrudedBrush, public deBrush
00332 {
00333 public:
00334 deExtrudedBrush();
00335 ~deExtrudedBrush();
00336
00337 WorldObjectClassDef;
00338
00339 void SetSourceLine(IdeLine * line);
00340 void SetExtrudeLine(IdeLine * line);
00341 void MakeSolid(deBoolean IsSolid);
00342
00343 protected:
00344 deBrush * CopyBrush();
00345
00346 private:
00347 void UpdateBrush();
00348
00349 void Extrude();
00350
00351 IdeLine * m_SourceLine;
00352 IdeLine * m_ExtrudeLine;
00353 bool m_Solid;
00354 };
00355
00356 class deXMesh;
00357 class deStaticBrush : public IdeStaticBrush, public deBrush
00358 {
00359 public:
00360 deStaticBrush();
00361 ~deStaticBrush();
00362
00363 WorldObjectClassDef;
00364
00365 void SetTextureState(IdeRenderTexture* texture);
00366 void AddPoly(deBPoly & poly);
00367 void AddIndexedBuffer(BIndexList indexbuffer);
00368 void BuildIndexedBuffers();
00369
00370 deBoolean AddVertices(const deBrushVertexData & vertexdata, long & indexoffset);
00371 deBoolean AddIndices(const deBrushIndexData & vertexdata, long indexoffset);
00372
00373 friend deBoolean IdeBrush_LoadFromXFile(char * filename, deTList<IdeStaticBrush*> & brushplist);
00374 friend deBoolean MakeStaticBrushList(deXMesh * mesh, deTList<IdeStaticBrush*> & brushplist);
00375
00376 protected:
00377 deBrush * CopyBrush();
00378 void SpecificRotate(deVec3d Center, deTransformInfo &M);
00379 void SpecificTranslate(deVec3d Delta);
00380 void SpecificScale(deVec3d Center, deDouble Scale);
00381
00382 private:
00383 void UpdateBrush();
00384
00385 void MakeArrays();
00386
00387 long m_CurrentTexture;
00388 };
00389
00390 class dePrismBrush : public IdePrismBrush, public deBrush
00391 {
00392 public:
00393 dePrismBrush();
00394 ~dePrismBrush();
00395
00396 WorldObjectClassDef;
00397
00398 protected:
00399 deBrush * CopyBrush();
00400
00401 private:
00402 void UpdateBrush();
00403
00404 deTArray <dePlane> m_Planes;
00405
00406 void GenerateHull();
00407 deBoolean PlaneIntersectionPoint(dePlane &p1, dePlane &p2, dePlane &p3, deVec3d &p);
00408 };
00409
00410 class deBezierBrush : public deBrush, public IdeBezierBrush
00411 {
00412 public:
00413 deBezierBrush();
00414 ~deBezierBrush();
00415
00416 WorldObjectClassDef;
00417
00418 protected:
00419 deBrush * CopyBrush();
00420
00421 private:
00422 void UpdateBrush();
00423
00424 void MakePatches();
00425 deBoolean m_IsSolid;
00426 };
00427
00428 class deLargeStaticBrush : public deBrush, public IdeLargeStaticBrush
00429 {
00430 public:
00431 deLargeStaticBrush();
00432 ~deLargeStaticBrush();
00433
00434 WorldObjectClassDef;
00435
00436 deBoolean SetNumTextures(long NumTextures);
00437 void SetWorldTransform(deTransformInfo & Matrix);
00438 deBoolean SetVertexBuffer(long TextureNum, IdeVertexBuffer* VBuffer);
00439
00440 protected:
00441 deBrush * CopyBrush();
00442
00443 private:
00444 void UpdateBrush();
00445
00446 void MakePatches();
00447 };
00448
00449 #endif